#include <iostream>
#include <vector>
#include <string>
#include <math.h>

using namespace std;

using ULL = unsigned long long;

vector<ULL> getCandidates(const string& n) {
    int len = n.length();
    vector<ULL> candidates = {
        (ULL)pow(10, len - 1) - 1,
        (ULL)pow(10, len) + 1,
    };
    ULL selfPrefix = stoull(n.substr(0, (len + 1) / 2));
    for (int i : {selfPrefix - 1, selfPrefix, selfPrefix + 1}) {
        string prefix = to_string(i);
        string candidate = prefix + string(prefix.rbegin() + (len & 1), prefix.rend());
        candidates.push_back(stoull(candidate));
    }
    return candidates;
}

string nearestPalindromic(string n) {
    ULL selfNumber = stoull(n), ans = -1;
    const vector<ULL>& candidates = getCandidates(n);
    for (auto& candidate : candidates) {
        if (candidate != selfNumber) {
            if (ans == -1 ||
                llabs(candidate - selfNumber) < llabs(ans - selfNumber) ||
                llabs(candidate - selfNumber) == llabs(ans - selfNumber) && candidate < ans) {
                ans = candidate;
            }
        }
    }
    return to_string(ans);
}

int main(){
    // string n = "123";
    string n = "11911";
    cout << nearestPalindromic(n) << endl;
    return 0;
}
